package script;

import com.mifmif.common.regex.Generex;
import delight.nashornsandbox.*;
import delight.nashornsandbox.NashornSandboxes;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.concurrent.Executors;

import static java.lang.System.err;

public class main {

//    public static void main6(String[] args) {
//        NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
//        String script = "new java.lang.ProcessBuilder('cmd ',' /c  notepad.exe').start()";
//        ScriptEngine engine = factory.getScriptEngine(new MyCF());
//        try {
//            engine.eval(script);
//        } catch (Exception e) {
//            System.out.println("Exception caught: " + e);
//        }
//    }


    public static void main5(String[] args) {
        ScriptEngineManager manager = new ScriptEngineManager();
        // 得到javascript脚本引擎
        ScriptEngine engine = manager.getEngineByName("nashorn");
        String rce1 = "new java.lang.ProcessBuilder('cmd ',' /c  notepad.exe').start()";

        try {
            engine.eval(rce1);
        } catch (ScriptException e) {
            err.println(e);
        }
    }

    public static String getMatchStr(String regex, int repl) {
        Generex generex = new Generex(regex);
        String randomStr = generex.random();
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(randomStr);
        stringBuffer.append(";\n");
        for (int i = 0; i < repl; i++) {
            stringBuffer.append("/");
        }
        return stringBuffer.toString();
    }

    public static void main2(String[] args) {
        NashornSandbox nashornSandbox = NashornSandboxes.create();
        nashornSandbox.setMaxCPUTime(100);// 设置脚本执行允许的最大CPU时间（以毫秒为单位），超过则会报异常,防止死循环脚本
        nashornSandbox.setMaxMemory(100 * 1024); //设置JS执行程序线程可以分配的最大内存（以字节为单位），超过会报ScriptMemoryAbuseException错误
        nashornSandbox.allowNoBraces(false); // 是否允许使用大括号
        nashornSandbox.allowLoadFunctions(false); // 是否允许nashorn加载全局函数
        nashornSandbox.setMaxPreparedStatements(30); // because preparing scripts for execution is expensive // LRU初缓存的初始化大小，默认为0
        nashornSandbox.setExecutor(Executors.newSingleThreadExecutor());// 指定执行程序服务，该服务用于在CPU时间运行脚本
        for (int i = 1; i <= 50; i++) {
            long startTime = System.currentTimeMillis();
            String js_script = getMatchStr("(([^;]+;){9}[^;]+)", i);
//            System.out.println("js_script : " + js_script);
            try {
                Object x = nashornSandbox.eval(js_script);
            } catch (Exception e) {

            }
            long endTime = System.currentTimeMillis();
            System.out.println(i + " cost time:" + (endTime - startTime) + "ms.");
        }
    }

    public static void main3(String[] args) {
        NashornSandbox nashornSandbox = NashornSandboxes.create();
        nashornSandbox.setMaxCPUTime(100);// 设置脚本执行允许的最大CPU时间（以毫秒为单位），超过则会报异常,防止死循环脚本
        nashornSandbox.setMaxMemory(1024 * 1024); //设置JS执行程序线程可以分配的最大内存（以字节为单位），超过会报ScriptMemoryAbuseException错误
        nashornSandbox.allowNoBraces(false); // 是否允许使用大括号
        nashornSandbox.allowLoadFunctions(false); // 是否允许nashorn加载全局函数
        nashornSandbox.setMaxPreparedStatements(30); // because preparing scripts for execution is expensive // LRU初缓存的初始化大小，默认为0
        nashornSandbox.setExecutor(Executors.newSingleThreadExecutor());// 指定执行程序服务，该服务用于在CPU时间运行脚本
        try {
            nashornSandbox.eval("var o={}, i=0; while (true) {o[i++]='abc';};");
        } catch (ScriptException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main7(String[] args) {
        NashornSandbox nashornSandbox = NashornSandboxes.create();
        nashornSandbox.setMaxCPUTime(100);// 设置脚本执行允许的最大CPU时间（以毫秒为单位），超过则会报异常,防止死循环脚本
        nashornSandbox.setMaxMemory(1024 * 1024); //设置JS执行程序线程可以分配的最大内存（以字节为单位），超过会报ScriptMemoryAbuseException错误
        nashornSandbox.allowNoBraces(false); // 是否允许使用大括号
        nashornSandbox.allowLoadFunctions(false); // 是否允许nashorn加载全局函数
        nashornSandbox.setMaxPreparedStatements(30); // because preparing scripts for execution is expensive // LRU初缓存的初始化大小，默认为0
        nashornSandbox.setExecutor(Executors.newSingleThreadExecutor());// 指定执行程序服务，该服务用于在CPU时间运行脚本
        try {
            nashornSandbox.eval("new java.lang.ProcessBuilder('cmd ',' /c  notepad.exe').start()");
        } catch (ScriptException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        NashornSandbox nashornSandbox = NashornSandboxes.create();
        nashornSandbox.setMaxCPUTime(100);// 设置脚本执行允许的最大CPU时间（以毫秒为单位），超过则会报异常,防止死循环脚本
        nashornSandbox.setMaxMemory(1024 * 1024); //设置JS执行程序线程可以分配的最大内存（以字节为单位），超过会报ScriptMemoryAbuseException错误
        nashornSandbox.allowNoBraces(false); // 是否允许使用大括号
        nashornSandbox.allowLoadFunctions(false); // 是否允许nashorn加载全局函数
        nashornSandbox.setMaxPreparedStatements(30); // because preparing scripts for execution is expensive // LRU初缓存的初始化大小，默认为0
        nashornSandbox.setExecutor(Executors.newSingleThreadExecutor());// 指定执行程序服务，该服务用于在CPU时间运行脚本
        try {
            nashornSandbox.eval("var str = 'abc qwe abd'\n" + "var reg1 = /[abc]/;// 只要包含有a 或者 包含有b 或者包含有c 都返回为true\n" + "print(reg1.test(str)); //true");
        } catch (ScriptException e) {
            throw new RuntimeException(e);
        }
    }

//    public static void main(String[] args) {
//        try {
//            Class v8 = Class.forName("com.eclipsesource.v8.V8");
//            String result = (String) v8.getDeclaredMethod("createV8Runtime").invoke();
//            System.out.println("result:" + result);
//        } catch (ClassNotFoundException e) {
//            throw new RuntimeException(e);
//        } catch (NoSuchMethodException e) {
//            throw new RuntimeException(e);
//        } catch (InvocationTargetException e) {
//            throw new RuntimeException(e);
//        } catch (IllegalAccessException e) {
//            throw new RuntimeException(e);
//        }
//    }
}
